<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.5" />
<title>pyboy.plugins.game_wrapper_super_mario_land API documentation</title>
<meta name="description" content="" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:0.8em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script async src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS_CHTML'></script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>pyboy.plugins.game_wrapper_super_mario_land</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">#
# License: See LICENSE file
# GitHub: https://github.com/Baekalfen/PyBoy
#
__pdoc__ = {
   &#39;GameWrapperSuperMarioLand.cartridge_title&#39;: False,
   &#39;GameWrapperSuperMarioLand.post_tick&#39;: False,
}

import logging

from pyboy.utils import WindowEvent

from .base_plugin import PyBoyGameWrapper

logger = logging.getLogger(__name__)

try:
    from cython import compiled
    cythonmode = compiled
except ImportError:
    cythonmode = False


class GameWrapperSuperMarioLand(PyBoyGameWrapper):
    &#34;&#34;&#34;
    This class wraps Super Mario Land, and provides easy access to score, coins, lives left, time left, world and a
    &#34;fitness&#34; score for AIs.

    If you call `print` on an instance of this object, it will show an overview of everything this object provides.
    &#34;&#34;&#34;
    cartridge_title = &#34;SUPER MARIOLAN&#34;

    def __init__(self, *args, **kwargs):
        self.shape = (20, 16)
        &#34;&#34;&#34;The shape of the game area&#34;&#34;&#34;
        self.world = (0, 0)
        &#34;&#34;&#34;Provides the current &#34;world&#34; Mario is in, as a tuple of as two integers (world, level).&#34;&#34;&#34;
        self.coins = 0
        &#34;&#34;&#34;The number of collected coins.&#34;&#34;&#34;
        self.lives_left = 0
        &#34;&#34;&#34;The number of lives Mario has left&#34;&#34;&#34;
        self.score = 0
        &#34;&#34;&#34;The score provided by the game&#34;&#34;&#34;
        self.time_left = 0
        &#34;&#34;&#34;The number of seconds left to finish the level&#34;&#34;&#34;
        self.level_progress = 0
        &#34;&#34;&#34;An integer of the current &#34;global&#34; X position in this level. Can be used for AI scoring.&#34;&#34;&#34;
        self._level_progress_max = 0
        self.fitness = 0
        &#34;&#34;&#34;
        A built-in fitness scoring. Taking points, level progression, time left, and lives left into account.

        .. math::
            fitness = (lives\\_left \\cdot 10000) + (score + time\\_left \\cdot 10) + (\\_level\\_progress\\_max \\cdot 10)
        &#34;&#34;&#34;

        super().__init__(*args, game_area_section = (0, 2) + self.shape, game_area_wrap_around=True, **kwargs)

    def post_tick(self):
        self._tile_cache_invalid = True
        self._sprite_cache_invalid = True

        self.world = self.tilemap_background[12, 1]-256, self.tilemap_background[14, 1]-256
        blank = 300
        self.coins = self._sum_number_on_screen(9, 1, 2, blank, -256)
        self.lives_left = self._sum_number_on_screen(6, 0, 2, blank, -256)
        self.score = self._sum_number_on_screen(0, 1, 6, blank, -256)
        self.time_left = self._sum_number_on_screen(17, 1, 3, blank, -256)

        level_block = self.pyboy.get_memory_value(0xC0AB)
        mario_x = self.pyboy.get_memory_value(0xC202)
        scx = self.pyboy.botsupport_manager().screen().tilemap_position_list()[16][0]
        self.level_progress = level_block*16 + (scx-7)%16 + mario_x

        if self.game_has_started:
            self._level_progress_max = max(self.level_progress, self._level_progress_max)
            end_score = self.score + self.time_left*10
            self.fitness = self.lives_left*10000 + end_score + self._level_progress_max*10

    def start_game(self):
        &#34;&#34;&#34;
        Call this function right after initializing PyBoy. This will start a game in world 1-1 and give back control on
        the first frame it&#39;s possible.

        The state of the emulator is saved, and using `reset_game`, you can get back to this point of the game
        instantly.
        &#34;&#34;&#34;
        if not self.pyboy.frame_count == 0:
            logger.warning(&#39;Calling start_game from an already running game. This might not work.&#39;)

        # Boot screen
        while True:
            self.pyboy.tick()
            if self.tilemap_background[6:11, 13] == [284, 285, 266, 283, 285]: # &#34;START&#34; on the main menu
                break
        self.pyboy.tick()
        self.pyboy.tick()
        self.pyboy.tick()

        self.pyboy.send_input(WindowEvent.PRESS_BUTTON_START)
        self.pyboy.tick()
        self.pyboy.send_input(WindowEvent.RELEASE_BUTTON_START)

        while True:
            self.pyboy.tick()
            self.tilemap_background.refresh_lcdc()

            # &#34;MARIO&#34; in the title bar and 0 is placed at score
            if self.tilemap_background[0:5, 0] == [278, 266, 283, 274, 280] and \
               self.tilemap_background[5, 1] == 256:
                self.game_has_started = True
                break

        self.saved_state.seek(0)
        self.pyboy.save_state(self.saved_state)

    def reset_game(self):
        &#34;&#34;&#34;
        After calling `start_game`, use this method to reset Mario to the beginning of world 1-1.

        If you want to reset to later parts of the game -- for example world 1-2 or 3-1 -- use the methods
        `pyboy.PyBoy.save_state` and `pyboy.PyBoy.load_state`.
        &#34;&#34;&#34;
        if self.game_has_started:
            self.saved_state.seek(0)
            self.pyboy.load_state(self.saved_state)
            self.post_tick()
        else:
            logger.error(&#34;Tried to reset game, but it hasn&#39;t been started yet!&#34;)

    def game_area(self):
        &#34;&#34;&#34;
        Use this method to get a matrix of the &#34;game area&#34; of the screen. This view is simplified to be perfect for
        machine learning applications.

        In Super Mario Land, this is almost the entire screen, expect for the top part showing the score, lives left
        and so on. These values can be found in the variables of this class.

        In this example, Mario is `0`, `1`, `16` and `17`. He is standing on the ground which is `352` and `353`:
        ```text
             0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
        ____________________________________________________________________________________
        0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339
        1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320
        2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300
        3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300
        4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
        5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
        6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
        7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300
        8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300
        9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300
        10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300
        11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300
        12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300
        13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300
        14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352
        15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353
        ```

        Returns
        -------
        memoryview:
            Simplified 2-dimensional memoryview of the screen
        &#34;&#34;&#34;
        return super().game_area()

    def __repr__(self):
        adjust = 4
        return (
            f&#34;Super Mario Land: World {&#39;-&#39;.join([str(i) for i in self.world])}\n&#34; +
            f&#34;Coins: {self.coins}\n&#34; +
            f&#34;lives_left: {self.lives_left}\n&#34; +
            f&#34;Score: {self.score}\n&#34; +
            f&#34;Time left: {self.time_left}\n&#34; +
            f&#34;Level progress: {self.level_progress}\n&#34; +
            f&#34;Fitness: {self.fitness}\n&#34; +
            &#34;Sprites on screen:\n&#34; +
            &#34;\n&#34;.join([str(s) for s in self.sprites_on_screen()]) +
            &#34;\n&#34; +
            &#34;Tiles on screen:\n&#34; +
            &#34; &#34;*5 + &#34;&#34;.join([f&#34;{i: &lt;4}&#34; for i in range(20)]) + &#34;\n&#34; +
            &#34;_&#34;*(adjust*20+4) +
            &#34;\n&#34; +
            &#34;\n&#34;.join(
                [
                    f&#34;{i: &lt;3}| &#34; + &#34;&#34;.join([str(tile).ljust(adjust) for tile in line])
                    for i, line in enumerate(self.game_area())
                ]
            )
        )</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand"><code class="flex name class">
<span>class <span class="ident">GameWrapperSuperMarioLand</span></span>
<span>(</span><span>*args, **kwargs)</span>
</code></dt>
<dd>
<section class="desc"><p>This class wraps Super Mario Land, and provides easy access to score, coins, lives left, time left, world and a
"fitness" score for AIs.</p>
<p>If you call <code>print</code> on an instance of this object, it will show an overview of everything this object provides.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class GameWrapperSuperMarioLand(PyBoyGameWrapper):
    &#34;&#34;&#34;
    This class wraps Super Mario Land, and provides easy access to score, coins, lives left, time left, world and a
    &#34;fitness&#34; score for AIs.

    If you call `print` on an instance of this object, it will show an overview of everything this object provides.
    &#34;&#34;&#34;
    cartridge_title = &#34;SUPER MARIOLAN&#34;

    def __init__(self, *args, **kwargs):
        self.shape = (20, 16)
        &#34;&#34;&#34;The shape of the game area&#34;&#34;&#34;
        self.world = (0, 0)
        &#34;&#34;&#34;Provides the current &#34;world&#34; Mario is in, as a tuple of as two integers (world, level).&#34;&#34;&#34;
        self.coins = 0
        &#34;&#34;&#34;The number of collected coins.&#34;&#34;&#34;
        self.lives_left = 0
        &#34;&#34;&#34;The number of lives Mario has left&#34;&#34;&#34;
        self.score = 0
        &#34;&#34;&#34;The score provided by the game&#34;&#34;&#34;
        self.time_left = 0
        &#34;&#34;&#34;The number of seconds left to finish the level&#34;&#34;&#34;
        self.level_progress = 0
        &#34;&#34;&#34;An integer of the current &#34;global&#34; X position in this level. Can be used for AI scoring.&#34;&#34;&#34;
        self._level_progress_max = 0
        self.fitness = 0
        &#34;&#34;&#34;
        A built-in fitness scoring. Taking points, level progression, time left, and lives left into account.

        .. math::
            fitness = (lives\\_left \\cdot 10000) + (score + time\\_left \\cdot 10) + (\\_level\\_progress\\_max \\cdot 10)
        &#34;&#34;&#34;

        super().__init__(*args, game_area_section = (0, 2) + self.shape, game_area_wrap_around=True, **kwargs)

    def post_tick(self):
        self._tile_cache_invalid = True
        self._sprite_cache_invalid = True

        self.world = self.tilemap_background[12, 1]-256, self.tilemap_background[14, 1]-256
        blank = 300
        self.coins = self._sum_number_on_screen(9, 1, 2, blank, -256)
        self.lives_left = self._sum_number_on_screen(6, 0, 2, blank, -256)
        self.score = self._sum_number_on_screen(0, 1, 6, blank, -256)
        self.time_left = self._sum_number_on_screen(17, 1, 3, blank, -256)

        level_block = self.pyboy.get_memory_value(0xC0AB)
        mario_x = self.pyboy.get_memory_value(0xC202)
        scx = self.pyboy.botsupport_manager().screen().tilemap_position_list()[16][0]
        self.level_progress = level_block*16 + (scx-7)%16 + mario_x

        if self.game_has_started:
            self._level_progress_max = max(self.level_progress, self._level_progress_max)
            end_score = self.score + self.time_left*10
            self.fitness = self.lives_left*10000 + end_score + self._level_progress_max*10

    def start_game(self):
        &#34;&#34;&#34;
        Call this function right after initializing PyBoy. This will start a game in world 1-1 and give back control on
        the first frame it&#39;s possible.

        The state of the emulator is saved, and using `reset_game`, you can get back to this point of the game
        instantly.
        &#34;&#34;&#34;
        if not self.pyboy.frame_count == 0:
            logger.warning(&#39;Calling start_game from an already running game. This might not work.&#39;)

        # Boot screen
        while True:
            self.pyboy.tick()
            if self.tilemap_background[6:11, 13] == [284, 285, 266, 283, 285]: # &#34;START&#34; on the main menu
                break
        self.pyboy.tick()
        self.pyboy.tick()
        self.pyboy.tick()

        self.pyboy.send_input(WindowEvent.PRESS_BUTTON_START)
        self.pyboy.tick()
        self.pyboy.send_input(WindowEvent.RELEASE_BUTTON_START)

        while True:
            self.pyboy.tick()
            self.tilemap_background.refresh_lcdc()

            # &#34;MARIO&#34; in the title bar and 0 is placed at score
            if self.tilemap_background[0:5, 0] == [278, 266, 283, 274, 280] and \
               self.tilemap_background[5, 1] == 256:
                self.game_has_started = True
                break

        self.saved_state.seek(0)
        self.pyboy.save_state(self.saved_state)

    def reset_game(self):
        &#34;&#34;&#34;
        After calling `start_game`, use this method to reset Mario to the beginning of world 1-1.

        If you want to reset to later parts of the game -- for example world 1-2 or 3-1 -- use the methods
        `pyboy.PyBoy.save_state` and `pyboy.PyBoy.load_state`.
        &#34;&#34;&#34;
        if self.game_has_started:
            self.saved_state.seek(0)
            self.pyboy.load_state(self.saved_state)
            self.post_tick()
        else:
            logger.error(&#34;Tried to reset game, but it hasn&#39;t been started yet!&#34;)

    def game_area(self):
        &#34;&#34;&#34;
        Use this method to get a matrix of the &#34;game area&#34; of the screen. This view is simplified to be perfect for
        machine learning applications.

        In Super Mario Land, this is almost the entire screen, expect for the top part showing the score, lives left
        and so on. These values can be found in the variables of this class.

        In this example, Mario is `0`, `1`, `16` and `17`. He is standing on the ground which is `352` and `353`:
        ```text
             0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
        ____________________________________________________________________________________
        0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339
        1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320
        2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300
        3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300
        4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
        5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
        6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
        7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300
        8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300
        9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300
        10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300
        11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300
        12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300
        13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300
        14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352
        15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353
        ```

        Returns
        -------
        memoryview:
            Simplified 2-dimensional memoryview of the screen
        &#34;&#34;&#34;
        return super().game_area()

    def __repr__(self):
        adjust = 4
        return (
            f&#34;Super Mario Land: World {&#39;-&#39;.join([str(i) for i in self.world])}\n&#34; +
            f&#34;Coins: {self.coins}\n&#34; +
            f&#34;lives_left: {self.lives_left}\n&#34; +
            f&#34;Score: {self.score}\n&#34; +
            f&#34;Time left: {self.time_left}\n&#34; +
            f&#34;Level progress: {self.level_progress}\n&#34; +
            f&#34;Fitness: {self.fitness}\n&#34; +
            &#34;Sprites on screen:\n&#34; +
            &#34;\n&#34;.join([str(s) for s in self.sprites_on_screen()]) +
            &#34;\n&#34; +
            &#34;Tiles on screen:\n&#34; +
            &#34; &#34;*5 + &#34;&#34;.join([f&#34;{i: &lt;4}&#34; for i in range(20)]) + &#34;\n&#34; +
            &#34;_&#34;*(adjust*20+4) +
            &#34;\n&#34; +
            &#34;\n&#34;.join(
                [
                    f&#34;{i: &lt;3}| &#34; + &#34;&#34;.join([str(tile).ljust(adjust) for tile in line])
                    for i, line in enumerate(self.game_area())
                ]
            )
        )</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="pyboy.plugins.base_plugin.PyBoyGameWrapper" href="base_plugin.html#pyboy.plugins.base_plugin.PyBoyGameWrapper">PyBoyGameWrapper</a></li>
<li>pyboy.plugins.base_plugin.PyBoyPlugin</li>
</ul>
<h3>Instance variables</h3>
<dl>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.shape"><code class="name">var <span class="ident">shape</span></code></dt>
<dd>
<section class="desc"><p>The shape of the game area</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.world"><code class="name">var <span class="ident">world</span></code></dt>
<dd>
<section class="desc"><p>Provides the current "world" Mario is in, as a tuple of as two integers (world, level).</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.coins"><code class="name">var <span class="ident">coins</span></code></dt>
<dd>
<section class="desc"><p>The number of collected coins.</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.lives_left"><code class="name">var <span class="ident">lives_left</span></code></dt>
<dd>
<section class="desc"><p>The number of lives Mario has left</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.score"><code class="name">var <span class="ident">score</span></code></dt>
<dd>
<section class="desc"><p>The score provided by the game</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.time_left"><code class="name">var <span class="ident">time_left</span></code></dt>
<dd>
<section class="desc"><p>The number of seconds left to finish the level</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.level_progress"><code class="name">var <span class="ident">level_progress</span></code></dt>
<dd>
<section class="desc"><p>An integer of the current "global" X position in this level. Can be used for AI scoring.</p></section>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.fitness"><code class="name">var <span class="ident">fitness</span></code></dt>
<dd>
<section class="desc"><p>A built-in fitness scoring. Taking points, level progression, time left, and lives left into account.</p>
<p><span><span class="MathJax_Preview"> fitness = (lives\_left \cdot 10000) + (score + time\_left \cdot 10) + (\_level\_progress\_max \cdot 10) </span><script type="math/tex; mode=display"> fitness = (lives\_left \cdot 10000) + (score + time\_left \cdot 10) + (\_level\_progress\_max \cdot 10) </script></span></p></section>
</dd>
</dl>
<h3>Methods</h3>
<dl>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.start_game"><code class="name flex">
<span>def <span class="ident">start_game</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"><p>Call this function right after initializing PyBoy. This will start a game in world 1-1 and give back control on
the first frame it's possible.</p>
<p>The state of the emulator is saved, and using <code>reset_game</code>, you can get back to this point of the game
instantly.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def start_game(self):
    &#34;&#34;&#34;
    Call this function right after initializing PyBoy. This will start a game in world 1-1 and give back control on
    the first frame it&#39;s possible.

    The state of the emulator is saved, and using `reset_game`, you can get back to this point of the game
    instantly.
    &#34;&#34;&#34;
    if not self.pyboy.frame_count == 0:
        logger.warning(&#39;Calling start_game from an already running game. This might not work.&#39;)

    # Boot screen
    while True:
        self.pyboy.tick()
        if self.tilemap_background[6:11, 13] == [284, 285, 266, 283, 285]: # &#34;START&#34; on the main menu
            break
    self.pyboy.tick()
    self.pyboy.tick()
    self.pyboy.tick()

    self.pyboy.send_input(WindowEvent.PRESS_BUTTON_START)
    self.pyboy.tick()
    self.pyboy.send_input(WindowEvent.RELEASE_BUTTON_START)

    while True:
        self.pyboy.tick()
        self.tilemap_background.refresh_lcdc()

        # &#34;MARIO&#34; in the title bar and 0 is placed at score
        if self.tilemap_background[0:5, 0] == [278, 266, 283, 274, 280] and \
           self.tilemap_background[5, 1] == 256:
            self.game_has_started = True
            break

    self.saved_state.seek(0)
    self.pyboy.save_state(self.saved_state)</code></pre>
</details>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.reset_game"><code class="name flex">
<span>def <span class="ident">reset_game</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"><p>After calling <code>start_game</code>, use this method to reset Mario to the beginning of world 1-1.</p>
<p>If you want to reset to later parts of the game &ndash; for example world 1-2 or 3-1 &ndash; use the methods
<a title="pyboy.PyBoy.save_state" href="../index.html#pyboy.PyBoy.save_state"><code>PyBoy.save_state()</code></a> and <a title="pyboy.PyBoy.load_state" href="../index.html#pyboy.PyBoy.load_state"><code>PyBoy.load_state()</code></a>.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def reset_game(self):
    &#34;&#34;&#34;
    After calling `start_game`, use this method to reset Mario to the beginning of world 1-1.

    If you want to reset to later parts of the game -- for example world 1-2 or 3-1 -- use the methods
    `pyboy.PyBoy.save_state` and `pyboy.PyBoy.load_state`.
    &#34;&#34;&#34;
    if self.game_has_started:
        self.saved_state.seek(0)
        self.pyboy.load_state(self.saved_state)
        self.post_tick()
    else:
        logger.error(&#34;Tried to reset game, but it hasn&#39;t been started yet!&#34;)</code></pre>
</details>
</dd>
<dt id="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.game_area"><code class="name flex">
<span>def <span class="ident">game_area</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"><p>Use this method to get a matrix of the "game area" of the screen. This view is simplified to be perfect for
machine learning applications.</p>
<p>In Super Mario Land, this is almost the entire screen, expect for the top part showing the score, lives left
and so on. These values can be found in the variables of this class.</p>
<p>In this example, Mario is <code>0</code>, <code>1</code>, <code>16</code> and <code>17</code>. He is standing on the ground which is <code>352</code> and <code>353</code>:</p>
<pre><code class="text">     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
____________________________________________________________________________________
0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339
1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320
2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300
3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300
4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300
8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300
9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300
10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300
11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300
12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300
13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300
14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352
15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353
</code></pre>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>memoryview</code>:</dt>
<dd>Simplified 2-dimensional memoryview of the screen</dd>
</dl></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def game_area(self):
    &#34;&#34;&#34;
    Use this method to get a matrix of the &#34;game area&#34; of the screen. This view is simplified to be perfect for
    machine learning applications.

    In Super Mario Land, this is almost the entire screen, expect for the top part showing the score, lives left
    and so on. These values can be found in the variables of this class.

    In this example, Mario is `0`, `1`, `16` and `17`. He is standing on the ground which is `352` and `353`:
    ```text
         0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
    ____________________________________________________________________________________
    0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339
    1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320
    2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300
    3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300
    4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
    5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
    6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
    7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300
    8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300
    9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300
    10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300
    11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300
    12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300
    13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300
    14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352
    15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353
    ```

    Returns
    -------
    memoryview:
        Simplified 2-dimensional memoryview of the screen
    &#34;&#34;&#34;
    return super().game_area()</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="pyboy.plugins" href="index.html">pyboy.plugins</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand">GameWrapperSuperMarioLand</a></code></h4>
<ul class="two-column">
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.start_game" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.start_game">start_game</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.reset_game" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.reset_game">reset_game</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.game_area" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.game_area">game_area</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.shape" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.shape">shape</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.world" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.world">world</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.coins" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.coins">coins</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.lives_left" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.lives_left">lives_left</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.score" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.score">score</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.time_left" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.time_left">time_left</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.level_progress" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.level_progress">level_progress</a></code></li>
<li><code><a title="pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.fitness" href="#pyboy.plugins.game_wrapper_super_mario_land.GameWrapperSuperMarioLand.fitness">fitness</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.5</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>